#include "stdafx.h"
#include "VSqlProc.h"

// VSqlProc ///////////////////////////////////////////////////////////////////

//
bool VSqlProc::setValueIn(const QString& name,const QVariant& value) 
{
	VField* field = fieldPtr(mParamsIn,name);
	if (field) 
	{
		field->setValue(value);
		return true;
	}
	return false;
}

/**************
//
bool VSqlProc::setValueIn(const QString& name,const VRecord& fromRecord) {
	VField* field = fromRecord.fieldPtr(name);
	if (!field) {
		return false;
	}
	setValueIn(name,field->value());
	return true;
}
*****************/

//
QVariant VSqlProc::valueIn(const QString& name) const {
	VField* field = fieldPtr(mParamsIn,name);
	if (field) {
		return field->value();
	}
	return QVariant();
}

//
QVariant VSqlProc::valueOut(const QString& name) const {
	VField* field = fieldPtr(mParamsOut,name);
	if (field) {
		return field->value();
	}
	return QVariant();
}

/**********
//
bool VSqlProc::valueOut(const QString& name,VRecord& toRecord) const {
	VField* field = toRecord.fieldPtr(name);
	if (!field) {
		return false;
	}
	field->setValue(valueOut(name));
	return true;
}
*************/

//
void VSqlProc::prepare(const QString& procName) {
	QString sql; sql
		= "execute procedure " + procName;

	if (mParamsIn.count()) {
		sql += "(";
	}
	
	for (int i = 0; i < mParamsIn.count(); i++) {
		sql += QString(":%1").arg(i);
		
		if (i + 1 < mParamsIn.count()) { 
			sql += ",";
		}
	}	

	if (mParamsIn.count()) {
		sql += ")";
	}

	mQuery.prepare(sql);
}

//
bool VSqlProc::exec() { 
	for (int i = 0; i < mParamsIn.count(); i++) {
//QString ss	= mParamsIn.field(i)->value().toString();
		mQuery.bindValue(i,fieldPtr(mParamsIn,i)->value());
	}
	
	return mQuery.exec();
}

//
bool VSqlProc::next() {
	if (!mQuery.next()) {
		return false;
	}
	
	for (int i = 0; i < mParamsOut.count(); i++) {
		fieldPtr(mParamsOut,i)->setValue(mQuery.value(i));
	}

	return true;
}


//
VField* VSqlProc::fieldPtr(const QList<VField>& fields,const QString& name)
{
	for (int i = 0; i < fields.count(); i++) {
		VField *field = const_cast<VField*>(&fields[i]);
		if (0 == field->name().compare(name,Qt::CaseInsensitive)) {
			return field;
		}
	}
	return NULL;
}
